package com.bbva.gptf.back.dominio;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

import org.apache.commons.lang.StringUtils;
import org.springframework.roo.addon.dbre.RooDbManaged;
import org.springframework.roo.addon.entity.RooEntity;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.tostring.RooToString;

@RooJavaBean
@RooToString
@RooDbManaged(automaticallyDelete = true)
@RooEntity(versionField = "", table = "TGPT006_GRUPO_DELTA", schema = "DBSGPT")
public class Tgpt006GrupoDelta {

	public static List<Tgpt006GrupoDelta> findTgpt006GrupoDeltaByCdGrupoDeltaGreaterThan(
			final BigDecimal cdGrupoDelta) {
		try {
			if (cdGrupoDelta == null) {
				return new ArrayList<Tgpt006GrupoDelta>();
			}
			final StringBuffer qlString = new StringBuffer(
					"FROM Tgpt006GrupoDelta gd ");
			qlString.append("WHERE gd.cdGrupoDelta > :cdGrupoDelta ");
			qlString.append("ORDER BY gd.nbGrupoDelta ");

			return entityManager()
					.createQuery(qlString.toString(), Tgpt006GrupoDelta.class)
					.setParameter("cdGrupoDelta", cdGrupoDelta).getResultList();
		} catch (final Exception e) {
			e.printStackTrace();
		}
		return new ArrayList<Tgpt006GrupoDelta>();
	}

	public static List<Tgpt006GrupoDelta> obtenerGrupoDeltaPorNombre(
			String nbGrupoDelta) {
		try {
			if (StringUtils.isBlank(nbGrupoDelta)) {
				return new ArrayList<Tgpt006GrupoDelta>();
			}
			nbGrupoDelta = nbGrupoDelta.toUpperCase();

			final StringBuffer qlString = new StringBuffer(
					"FROM Tgpt006GrupoDelta grupoDelta ");
			qlString.append("WHERE UPPER(grupoDelta.nbGrupoDelta) LIKE :nbGrupoDelta ");
			qlString.append("AND grupoDelta.cdGrupoDelta != '0' ");
			qlString.append("ORDER BY grupoDelta.nbGrupoDelta ");
			return entityManager()
					.createQuery(qlString.toString(), Tgpt006GrupoDelta.class)
					.setParameter("nbGrupoDelta", nbGrupoDelta).getResultList();
		} catch (final Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return new ArrayList<Tgpt006GrupoDelta>();
	}

	public static List<Tgpt006GrupoDelta> obtieneGrupoDeltasPorGestor(
			final String cdBancomer, final String cdBancomerMancuerna) {
		final BigDecimal stVigente = new BigDecimal(1);
		if (cdBancomerMancuerna != null) {
			final String qlString = "from Tgpt006GrupoDelta grupoDelta where grupoDelta.cdGrupoDelta IN "
					+ "(select clasifDelta.cdGrupoDelta from Tgpt007ClasiDelta clasifDelta where clasifDelta.cdClasifDelta IN ( "
					+ "Select contrato.cdClasifDelta from Tgpt016Contrato contrato where contrato.stVigente = :stVigente AND "
					+ "( contrato.cdGestor IN (:cdBancomer, :cdBancomerMancuerna) "
					+ "OR contrato.cdGestorRv IN (:cdBancomer, :cdBancomerMancuerna)))) ";
			return entityManager()
					.createQuery(qlString, Tgpt006GrupoDelta.class)
					.setParameter("stVigente", stVigente)
					.setParameter("cdBancomer", cdBancomer)
					.setParameter("cdBancomerMancuerna", cdBancomerMancuerna)
					.getResultList();
		} else {
			final String qlString = "from Tgpt006GrupoDelta grupoDelta where grupoDelta.cdGrupoDelta IN "
					+ "(select clasifDelta.cdGrupoDelta from Tgpt007ClasiDelta clasifDelta where clasifDelta.cdClasifDelta IN ( "
					+ "Select contrato.cdClasifDelta from Tgpt016Contrato contrato where contrato.stVigente = :stVigente AND "
					+ " contrato.cdGestor IN (:cdBancomer) "
					+ "OR contrato.cdGestorRv IN (:cdBancomer)))";
			return entityManager()
					.createQuery(qlString, Tgpt006GrupoDelta.class)
					.setParameter("stVigente", stVigente)
					.setParameter("cdBancomer", cdBancomer).getResultList();
		}
	}

	public static List<Tgpt006GrupoDelta> obtieneGrupoDeltasPorTipoMercado(
			final BigDecimal tipoMercado) {
		final BigDecimal stVigente = new BigDecimal(1);
		String qlString = "from Tgpt006GrupoDelta grupoDelta where grupoDelta.cdGrupoDelta IN "
				+ "(select clasifDelta.cdGrupoDelta from Tgpt007ClasiDelta clasifDelta where clasifDelta.cdClasifDelta IN ( "
				+ "Select contrato.cdClasifDelta from Tgpt016Contrato contrato where contrato.stVigente = :stVigente ";
		if (tipoMercado.equals(BigDecimal.ONE)) {
			qlString += " AND contrato.cdGestorRv IS NOT NULL)) ";
		} else {
			qlString += " AND contrato.cdGestor IS NOT NULL)) ";
		}
		return entityManager().createQuery(qlString, Tgpt006GrupoDelta.class).setParameter("stVigente", stVigente).getResultList();
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_grupo_delta")
	@SequenceGenerator(name = "sq_grupo_delta", sequenceName = "SQ_GRUPO_DELTA")
	@Column(name = "CD_GRUPO_DELTA")
	private BigDecimal cdGrupoDelta;

}
